package edu.cebanc.spring.biblioteca.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import edu.cebanc.spring.biblioteca.bean.AutorBean;
import edu.cebanc.spring.biblioteca.bean.BajaBean;
import edu.cebanc.spring.biblioteca.bean.EjemplarBean;
import edu.cebanc.spring.biblioteca.bean.GeneroBean;
import edu.cebanc.spring.biblioteca.bean.LibroBean;
import edu.cebanc.spring.biblioteca.service.LibrosService;

@Controller
@RequestMapping(value="/libros")
public class LibrosController {
	
	@Autowired
	LibrosService librosService;
	LibroBean libro;
	
	@RequestMapping(method=RequestMethod.GET)
	public String getMainView(Model model){
		
		model.addAttribute("libros", librosService.listadoLibros());
		
		return "librosMain";
	}
	
	@RequestMapping(value="formLibro", method=RequestMethod.GET)
	public String getFormView(Model model){
		
		model.addAttribute("libro", new LibroBean());
		
		return "librosForm";
	}
	
	@RequestMapping(value="dataLibro", method=RequestMethod.POST)
	public String dataLibro(LibroBean libro, BindingResult result, Model model){
		
		if(result.hasErrors()){
			model.addAttribute("libro", libro);
			return "librosForm";
		}
		
		librosService.guardarLibro(libro);
		
		return "redirect:/libros";
	}
	
	@RequestMapping(value="infoLibro/{id}", method=RequestMethod.GET)
	public String getInfoView(@PathVariable String id, Model model){
		
		this.libro=librosService.cargarLibro(id);
		
		model.addAttribute("libro", this.libro);
		
		return "librosInfo";
	}
	
	@RequestMapping(value="editLibro", method=RequestMethod.GET)
	public String getEditView(Model model){
		
		model.addAttribute("libro", librosService.cargarLibro(String.valueOf(this.libro.getId_libro())));
		
		return "librosForm";
	}
	
	@RequestMapping(value="deleteLibro", method=RequestMethod.GET)
	public String deleteLibro(Model model){
		
		librosService.eliminarLibro(String.valueOf(this.libro.getId_libro()));
		
		return "redirect:/libros";
	}
	
	@RequestMapping(value="addAutorLibro", method=RequestMethod.GET)
	public String getAddAutorView(Model model){
		
		model.addAttribute("autores", librosService.getAutores(this.libro));
		model.addAttribute("autor", new AutorBean());
		return "librosAutor";
	}
	
	@RequestMapping(value="deleteAutorLibro/{id}", method=RequestMethod.GET)
	public String deleteAutorLibro(@PathVariable String id, Model model){
		
		librosService.deleteAutorLibro(libro, id);
		
		return "redirect:/libros/infoLibro/"+this.libro.getId_libro();
	}
	
	@RequestMapping(value="deleteGeneroLibro/{id}", method=RequestMethod.GET)
	public String deleteGeneroLibro(@PathVariable String id, Model model){
		
		librosService.deleteGeneroLibro(libro, id);
		
		return "redirect:/libros/infoLibro/"+this.libro.getId_libro();
	}
	
	@RequestMapping(value="dataAutorLibro", method=RequestMethod.POST)
	public String dataAutorLibro(AutorBean autor, BindingResult result, Model model){
		
		if(result.hasErrors()){
			model.addAttribute("autor", autor);
			return "librosAutor";
		}
		
		librosService.addAutorToLibro(this.libro, autor);
		
		return "redirect:/libros/infoLibro/"+this.libro.getId_libro();
	}
	
	@RequestMapping(value="addGeneroLibro", method=RequestMethod.GET)
	public String getAddGeneroView(Model model){
		
		model.addAttribute("generos", librosService.getGeneros(this.libro));
		model.addAttribute("genero", new GeneroBean());
		return "librosGenero";
	}
	
	@RequestMapping(value="dataGeneroLibro", method=RequestMethod.POST)
	public String dataGeneroLibro(GeneroBean genero, BindingResult result, Model model){
		
		if(result.hasErrors()){
			model.addAttribute("genero", genero);
			return "librosGenero";
		}
		
		librosService.addGeneroToLibro(this.libro, genero);
		
		return "redirect:/libros";
	}
	
	@RequestMapping(value="addEjemplarLibro", method=RequestMethod.GET)
	public String getAddEjemplarView(Model model){
		
		model.addAttribute("idiomas", librosService.getIdiomas());
		model.addAttribute("editoriales", librosService.getEditoriales());
		model.addAttribute("ejemplar", new EjemplarBean());
		return "librosEjemplar";
	}
	
	@RequestMapping(value="editEjemplarLibro/{id}", method=RequestMethod.GET)
	public String getEditEjemplarView(@PathVariable String id, Model model){
		
		model.addAttribute("idiomas", librosService.getIdiomas());
		model.addAttribute("editoriales", librosService.getEditoriales());
		model.addAttribute("ejemplar", librosService.cargarEjemplar(id));
		return "librosEjemplar";
	}
	
	@RequestMapping(value="dataEjemplarLibro", method=RequestMethod.POST)
	public String dataEjemplarLibro(EjemplarBean ejemplar, BindingResult result, Model model){
		
		if(result.hasErrors()){
			model.addAttribute("ejemplar", ejemplar);
			return "librosEjemplar";
		}
		if(ejemplar.getId_ejemplar() == 0){
			librosService.addEjemplarToLibro(this.libro, ejemplar);
		}
		else{
			librosService.updateEjemplar(ejemplar);
		}
		
		return "redirect:/libros";
	}
	
	@RequestMapping(value="bajaEjemplar/{id}", method=RequestMethod.GET)
	public String getBajaEjemplarFormView(@PathVariable String id, Model model){
		
		BajaBean baja = new BajaBean();
		baja.setId_ejemplar(Integer.parseInt(id));
		model.addAttribute("baja", baja);

		return "librosBajaEjemplar";
	}
	
	@RequestMapping(value="dataBajaEjemplar", method=RequestMethod.POST)
	public String dataBajaEjemplar(BajaBean baja, BindingResult result, Model model){
		
		if(result.hasErrors()){
			model.addAttribute("baja", baja);
			return "librosBajaEjemplar";
		}
		
		librosService.bajaEjemplarLibro(baja);
		
		return "redirect:/libros/infoLibro/"+this.libro.getId_libro();
	}
}
